package com.sunshine.leetcode.easy;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值。
 * <p>
 * 你的任务是找到与 nums 拥有相同大小的度的最短连续子数组，返回其长度。
 * <p>
 * 示例 1:
 * <p>
 * 输入: [1, 2, 2, 3, 1]
 * 输出: 2
 * 解释:
 * 输入数组的度是2，因为元素1和2的出现频数最大，均为2.
 * 连续子数组里面拥有相同度的有如下所示:
 * [1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
 * 最短连续子数组[2, 2]的长度为2，所以返回2.
 * 示例 2:
 * <p>
 * 输入: [1,2,2,3,1,4,2]
 * 输出: 6
 * <p>
 * nums.length 在1到50,000区间范围内。
 * nums[i] 是一个在0到49,999范围内的整数。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/degree-of-an-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author WeiHong
 * @date 2020/4/24 15:44
 */
public class FindShortestSubArray {

    /**
     * 1.获取数组的度的数值
     * 2.通过值截取数组
     *
     * @param nums
     * @return
     */
    public static int myFindShortestSubArray(int[] nums) {
        if (nums.length == 1){
            return 1;
        }
        //数组的度
        int maxCount = 0;
        //数组的度的值
        int value = 0;
        Map<Integer, Integer> temp = new HashMap<>(10);
        for (int num : nums) {
            Integer n = temp.get(num);
            if (n == null) {
                temp.put(num, 1);
                if (value == 0){
                    value = num;
                }
            } else {
                temp.put(num, ++n);
                if (n > maxCount) {
                    maxCount = n;
                    value = num;
                }
            }

        }
        List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
        return list.subList(list.indexOf(value), list.lastIndexOf(value) + 1).size();
    }

}
